#include "font.h"
#include <stdio.h>
#include <stdarg.h>

//===============================================================
// Initializes the specified font.
//===============================================================
CFont::CFont(const char *szFace, int nHeight): m_nHeight(abs(nHeight))
{
	HFONT hOldFont;
	m_nList = glGenLists(96);

	HDC hDC = wglGetCurrentDC();

	m_hFont = CreateFont(-m_nHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH, szFace);
	hOldFont = (HFONT)SelectObject(hDC, m_hFont);

	wglUseFontBitmaps(hDC, 32, 96, m_nList);
	GetCharWidth(hDC, 'A', 'A', &m_nCharWidth);

	SelectObject(hDC, hOldFont);
}

//===============================================================
// Gets the height of the specified string in pixels.
//===============================================================
int CFont::MeasureString(const char *szText)
{
	return strlen(szText) * m_nCharWidth;
}

//===============================================================
// Releases all textures and lists allocated by the font.
//===============================================================
CFont::~CFont()
{
	glDeleteLists(m_nList, 96);
	DeleteObject(m_hFont);
}

//===============================================================
// Prints the specified text on the screen.
//===============================================================
void CFont::Print(float flX, float flY, const char *szFormat, ...)
{
	if (!szFormat)
		return;

	char szText[1024];
	va_list ap;
	va_start(ap, szFormat);
	vsprintf(szText, szFormat, ap);
	va_end(ap);

	glRasterPos2f(flX, flY + float(m_nHeight));

	glPushAttrib(GL_LIST_BIT);
	glListBase(m_nList - 32);
	glCallLists(strlen(szText), GL_UNSIGNED_BYTE, szText);
	glPopAttrib();
}
